网络协议系统梳理

来源:MDN HTTP · MDN TLS · IETF RFCs · IANA

网络协议是计算机网络中设备之间通信的规则和标准。现代互联网建立在分层协议栈 (Layered Protocol Stack)之上,每一层对下层封装的数据进行抽象,向上一层提供服务。核心协议栈是 TCP/IP,对应理论参考模型 OSI。

网络协议全景
图 0: 网络协议栈 (Protocol Stack)全景——TCP/IP 四层模型与关键协议

1. 概述

互联网协议的核心设计思想:

原则含义体现
分层封装 (Layered Encapsulation)上层数据作为下层 payloadHTTP → TCP segment → IP packet → Ethernet frame
端到端 (End-to-End)智能终端 + 简单网络TCP 拥塞控制 (Congestion Control)由两端负责,中间路由只转发
尽力而为 (Best Effort)IP 层不保证交付可靠性由 TCP 在上层弥补
无状态/有状态协议选择取决于场景HTTP 无状态,TCP 有状态连接
关键认知:网络协议不是单一系统,而是多层协议的组合栈。每层只关心自己的职责:物理层传比特、链路层传帧、网络层传包、传输层保证可靠/不可靠传输、应用层处理业务逻辑。新增协议(如 QUIC)可能跨层优化,但核心分层思想不变。

术语

缩写全称说明
LANLocal Area Network局域网,小范围(办公室、家庭)的内部网络
WANWide Area Network广域网,跨地域的大型网络,互联网是最大的 WAN
MTUMaximum Transmission Unit最大传输单元,链路层能承载的最大包长,以太网默认 1500 字节
MSSMaximum Segment SizeTCP 最大段大小 = MTU - IP头 - TCP头,通常 1460 字节
RTTRound-Trip Time往返时间,数据包从发出到收到确认的总耗时
TTFBTime To First Byte首字节时间,从发起请求到收到响应第一个字节的耗时
payload—有效载荷,协议中实际承载的上层数据,排除头部开销
协议栈 (Protocol Stack)Protocol Stack多层协议堆叠形成的完整通信方案,下层封装为上层服务

2. 行为分析(协议做什么)

2.1 用例图:网络协议的参与者与功能

客户端(浏览器/App)通过协议栈 (Protocol Stack)与远端服务器交互,DNS 负责域名解析,中间路由器只转发 IP 包。

Use Case
图 2.1: 网络协议参与者用例图

2.2 活动图:数据穿越协议栈 (Protocol Stack)

发送方从上到下逐层封装头部,接收方从下到上逐层解封,每层只处理自己的头部信息。

Layer Flow
图 2.2: 数据穿越协议栈 (Protocol Stack)活动图

2.3 时序图:HTTPS 完整请求流程

从 DNS 解析开始,经历 TCP 三次握手 (Three-Way Handshake)、TLS 1.3 握手(1-RTT)、HTTP 请求/响应,到 TCP 四次挥手 (Four-Way Wave)。这是现代 Web 应用最核心的交互模式。

HTTPS Full Sequence
图 2.3: HTTPS 完整生命周期时序图
Demo: curl 命令查看握手详情
curl -w "DNS: %{time_namelookup}s\\nTCP: %{time_connect}s\\nTLS: %{time_appconnect}s\\nTTFB: %{time_starttransfer}s\\nTotal: %{time_total}s\\n" \\
     -o /dev/null -s https://www.example.com

2.4 状态机图:TCP 连接状态迁移

TCP 连接从 CLOSED 到 ESTABLISHED 再到 CLOSED,有 11 种状态。服务端通常比客户端多出 LISTEN 和 CLOSE_WAIT 状态。

TCP State Machine
图 2.4: TCP 连接状态机

3. 结构分析(协议由什么组成)

3.1 包图:OSI 七层 vs TCP/IP 四层模型

OSI 是理论参考模型(7层),TCP/IP 是实际部署模型(4层)。OSI 的会话层 (Session Layer)/表示层 (Presentation Layer)在 TCP/IP 中被合并到应用层。

OSI vs TCP/IP
图 3.1: OSI 七层 vs TCP/IP 四层协议栈 (Protocol Stack)对比

3.2 类图:核心协议头部结构

各层协议的头部(Header)定义了本层的控制信息。以下是 IPv4、TCP、UDP 和 HTTP 消息的头部字段结构。

Protocol Headers
图 3.2: IPv4、TCP、UDP、HTTP 消息头部结构类图

3.3 部署图:协议栈 (Protocol Stack)在网络节点上的分布

不同网络节点运行的协议层级不同:终端运行完整协议栈 (Protocol Stack),路由器只运行到网络层(IP),交换机只运行到数据链路层 (Data Link Layer)。

Network Deployment
图 3.3: 协议栈 (Protocol Stack)在各网络节点上的部署图

4. 各层协议详解

4.1 IP 协议(网络层)

IP(Internet Protocol)是 TCP/IP 协议栈 (Protocol Stack)的核心,负责寻址和路由 (Addressing and Routing)。它提供"尽力而为 (Best Effort)"的无连接 (Connectionless)数据报 (Datagram)服务——不保证交付、不保证顺序、不保证不重复。

IPv4(32位地址)
  • 地址格式:192.168.1.1
  • 头部长度:20~60 字节
  • 总地址数:约 43 亿
  • 依赖 NAT 缓解枯竭
  • 广播支持
IPv6(128位地址)
  • 地址格式:2001:db8::1
  • 头部长度:固定 40 字节
  • 总地址数:约 3.4×10³⁸
  • 不再需要 NAT
  • 无广播,用组播替代
IP 路由原理:每个路由器维护路由表,根据目标 IP 地址的最长前缀匹配 (Longest Prefix Match)(Longest Prefix Match)决定下一跳。IP 包的 TTL(Time To Live)每经过一跳减 1,减到 0 则丢弃并返回 ICMP 超时消息——traceroute 正是利用此机制。

术语

缩写全称说明
NATNetwork Address Translation网络地址转换,将私有 IP 映射到公网 IP,缓解 IPv4 地址枯竭
ICMPInternet Control Message Protocol互联网控制报文协议,用于诊断(ping)和错误报告(TTL 超时)
TTLTime To Live生存时间,IP 包每经过一跳减 1,到 0 则丢弃(防环路)
ARPAddress Resolution Protocol地址解析协议,以 IP 查 MAC 地址。发送方广播"谁有 192.168.1.1?"
DHCPDynamic Host Configuration Protocol动态主机配置,自动分配 IP 地址、网关、DNS 给入网设备
CIDRClassless Inter-Domain Routing无类域间路由,用前缀长度表示子网,如 192.168.1.0/24
AS / BGPAutonomous System / Border Gateway ProtocolAS 是一个机构控制的 IP 网络集合;BGP 在 AS 之间交换路由信息——互联网的"邮政编码系统"

4.2 TCP 协议(传输层——可靠)

TCP(Transmission Control Protocol)在不可靠的 IP 层之上提供可靠的、面向连接 (Connection-Oriented)的、字节流 (Byte Stream)传输服务。由 Vint Cerf 和 Bob Kahn 于 1974 年提出。

机制实现方式作用
确认与重传 (Acknowledgment & Retransmission)ACK + 超时重传保证数据不丢失
序列号 (Sequence Number)每字节编号保证顺序、去重
流量控制 (Flow Control)滑动窗口 (Sliding Window)(Window)防止发送方压垮接收方
拥塞控制 (Congestion Control)慢启动 (Slow Start) / 拥堵避免 (Congestion Avoidance) / 快速恢复 (Fast Recovery)防止网络过载
三次握手 (Three-Way Handshake)SYN → SYN-ACK → ACK建立双向连接
四次挥手 (Four-Way Wave)FIN → ACK → FIN → ACK优雅关闭连接
Demo: Python TCP 客户端/服务器
server.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.bind(('0.0.0.0', 8080))
s.listen(1)
conn, addr = s.accept()
print(f"Connected: {addr}")
data = conn.recv(1024)
conn.sendall(b"HTTP/1.1 200 OK\\r\\n\\r\\nHello TCP")
conn.close()
client.py
import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('127.0.0.1', 8080))
s.sendall(b"GET / HTTP/1.1\\r\\nHost: localhost\\r\\n\\r\\n")
print(s.recv(1024).decode())
s.close()

术语

缩写说明
SYNSynchronize,TCP 连接建立请求标志位
ACKAcknowledgment,确认标志位,确认序号有效
FINFinish,连接关闭请求标志位
RSTReset,异常重置连接标志位
滑动窗口 (Sliding Window)TCP 流量控制 (Flow Control)核心机制,接收方通告可用缓冲区大小,发送方据此调节发送速率
拥塞控制 (Congestion Control)防止网络过载:慢启动 (Slow Start)(指数增长)→ 拥堵避免 (Congestion Avoidance)(线性增长)→ 快速恢复 (Fast Recovery)

4.3 UDP 协议(传输层——不可靠)

UDP(User Datagram Protocol)提供无连接 (Connectionless)的、不可靠的、数据报 (Datagram)传输。不保证交付,无拥塞控制 (Congestion Control),头部仅 8 字节。适用于实时应用(VoIP、视频流、在线游戏)和简单查询(DNS)。

特性TCPUDP
连接面向连接 (Connection-Oriented)(三次握手 (Three-Way Handshake))无连接 (Connectionless)
可靠性确认+重传,保证交付不保证
顺序严格保序 (In-Order Delivery)不保证
头部大小20~60 字节8 字节
流量/拥塞控制 (Congestion Control)有无
典型应用HTTP、SSH、FTP、SMTPDNS、VoIP、视频流、QUIC
QUIC 基于 UDP:HTTP/3 使用的 QUIC 协议运行在 UDP 之上,在应用层实现了 TCP 的可靠性 + TLS 的加密 + 多路复用,避免了 TCP 队头阻塞 (Head-of-Line Blocking)(HOL Blocking)问题。

4.4 DNS 协议(应用层——域名解析)

DNS(Domain Name System)是互联网的"电话簿",将人类可读的域名(如 www.example.com)转换为机器可读的 IP 地址。使用 UDP 端口 53(也可走 TCP 53 或 HTTPS/DoH)。

DNS Resolution
图 4.4: DNS 递归解析流程

DNS 记录类型:

类型用途示例
A域名 → IPv4example.com → 93.184.216.34
AAAA域名 → IPv6example.com → 2606:2800:220:1:248:1893:25c8:1946
CNAME别名www.example.com → example.com
MX邮件服务器example.com → mail.example.com
NS权威 DNS 服务器example.com → ns1.example.com
TXT文本记录(验证等)SPF、DKIM、域名验证
Demo: 使用 dig 查询 DNS
dig +short A example.com          # 查 IPv4
dig +short AAAA example.com       # 查 IPv6
dig +short MX example.com         # 查邮件服务器
dig +trace example.com            # 跟踪递归解析全过程
nslookup example.com              # Windows 风格查询

术语

缩写全称说明
DoHDNS over HTTPS将 DNS 查询封装在 HTTPS 中传输,防 ISP 窥探域名
DoTDNS over TLSDNS 查询经 TLS 加密(端口 853),与 DoH 目的一致
TLDTop-Level Domain顶级域名,如 .com .org .cn .io
权威 DNSAuthoritative DNS持有某域名最终解析记录的服务器,由域名所有者管理
递归 DNSRecursive Resolver替客户端完成完整解析链路的 DNS 服务器,如 8.8.8.8, 114.114.114.114
stub resolver—操作系统内置的最小化 DNS 客户端,只负责把查询发给递归 DNS
SPFSender Policy Framework声明哪些邮件服务器有权以该域名发送邮件
DKIMDomainKeys Identified Mail邮件数字签名 (Digital Signature)验证,防止内容被篡改

4.5 TLS 协议(会话层 (Session Layer)——传输安全)

TLS(Transport Layer Security)在 TCP 之上提供加密、完整校验 (Integrity)和身份认证 (Authentication)。最新版本 TLS 1.3(RFC 8446)将握手从 2-RTT 优化为 1-RTT。

核心原理一句话:HTTPS 最核心就是利用非对称加密算法,拿服务器的公钥来加密数据。客户端用服务器公钥加密请求,只有持有对应私钥的服务器能解密——中间人截获了也看不懂。实际性能优化为:非对称加密只用来在握手阶段交换一把临时对称密钥,之后的数据传输用对称加密(AES-GCM 等),因为对称加密比非对称快几个数量级。
功能机制
加密(Encryption)对称加密(AES-GCM、ChaCha20-Poly1305),数据在传输中不可读
完整性(Integrity)HMAC / AEAD,防止数据被篡改
认证 (Authentication)(Authentication)X.509 数字证书 + 非对称加密(ECDHE、RSA),验证服务器身份

TLS 1.3 握手流程(1-RTT):

  1. ClientHello:发送支持的密码套件 (Cipher Suite) + 密钥共享 (Key Share)(DH 公钥)
  2. ServerHello:选择密码套件 (Cipher Suite) + 密钥共享 (Key Share) + 证书 + Finished(已加密)
  3. Client Finished:验证证书,发送 Finished(已加密)
  4. 握手完成,开始传输应用数据(Application Data)
证书链验证 (Certificate Chain Verification):浏览器内置信任的根 CA(Certificate Authority)列表。服务器证书由中间 CA 签发,中间 CA 由根 CA 签发。浏览器沿链验证到根 CA,确认证 (Authentication)书可信。Let's Encrypt 提供免费的 DV 证书。

4.5.1 X.509 数字证书详解

证书的本质:一个符合 X.509 标准的二进制结构,包含以下核心字段:

字段说明示例
Subject证书持有者(域名/组织)CN=*.example.com, O=Example Inc.
Subject Public Key持有者的公钥256-bit ECDSA 公钥
Issuer签发者(上级 CA)CN=R3, O=Let's Encrypt
Validity有效期 (notBefore / notAfter)2026-01-01 ~ 2027-01-01
Serial Number证书序列号 (Sequence Number)(唯一标识)0a:1b:2c:...
Signature Algorithm签发时使用的签名算法sha256WithRSAEncryption
SignatureCA 对上述字段的签名值用 CA 私钥对 tbsCertificate 签名
SAN (Subject Alternative Name)证书覆盖的域名列表example.com, *.example.com

核心原理:CA 用自己的私钥对证书内容做数字签名 (Digital Signature)。客户端用 CA 的公钥验签,若通过则证明"证书内容未被篡改,且该公钥确实属于 Subject"。这是信任链 (Chain of Trust)的根基。

4.5.2 PEM 格式

PEM(Privacy-Enhanced Mail)是最常见的证书编码格式。本质是 DER 二进制内容的 Base64 编码,用 -----BEGIN/END----- 头尾包裹,方便文本传输和粘贴。

格式编码扩展名典型应用
PEMBase64 文本.pem, .crt, .key, .csrApache, Nginx, Linux 系统
DER二进制.der, .cerJava, Windows
PKCS#12二进制(含私钥+证书).pfx, .p12Windows IIS, 导入浏览器
JKSJava Keystore.jksJava/Tomcat
-----BEGIN CERTIFICATE-----
MIIDrzCCApegAwIBAgIQCDQgK2A...
... (Base64 encoded DER) ...
-----END CERTIFICATE-----

明文查看 PEM 内容:

openssl x509 -in cert.pem -text -noout

4.5.3 证书存储位置

位置路径说明
Linux 系统信任库/etc/ssl/certs/Debian/Ubuntu 系列,由 ca-certificates 包管理
/etc/pki/tls/certs/RHEL/CentOS/Fedora 系列
macOS 系统信任库钥匙串访问 (Keychain)/System/Library/Keychains/SystemRootCertificates.keychain
Nginx/Apache配置文件指定,通常 /etc/nginx/ssl/需同时配置 ssl_certificate 和 ssl_certificate_key
Java$JAVA_HOME/lib/security/cacertsJKS 格式,默认密码 changeit
Chrome系统信任库(Win/macOS)或 NSS DB(Linux)chrome://settings/certificates
Firefox独立 NSS 证书库,不依赖操作系统~/.mozilla/firefox/*/cert9.db
Let's Encrypt/etc/letsencrypt/live/<domain>/certbot 默认输出路径

4.5.4 实战:生成与使用证书

1. 生成私钥:

# ECDSA (推荐,性能好,密钥小)
openssl ecparam -genkey -name prime256v1 -out server.key

# RSA 2048 (兼容性最好)
openssl genrsa -out server.key 2048

2. 生成 CSR(证书签名请求):

openssl req -new -key server.key -out server.csr \
  -subj "/C=CN/ST=Guangdong/L=Shenzhen/O=MicroArch/CN=*.example.com"

3. 自签名证书(开发/测试用):

openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
  -days 365 -nodes \
  -keyout server.key -out server.crt \
  -subj "/CN=localhost" \
  -addext "subjectAltName=DNS:localhost,DNS:*.local"

4. 查看证书内容:

openssl x509 -in server.crt -text -noout    # 全部字段
openssl x509 -in server.crt -dates -noout   # 仅有效期
openssl x509 -in server.crt -subject -noout # 仅 Subject
openssl x509 -in server.crt -fingerprint -sha256 -noout  # 指纹

5. 验证证书链:

# 验证服务器证书是否由指定 CA 签发
openssl verify -CAfile ca-bundle.crt server.crt

# 查看远端服务器证书链
openssl s_client -connect example.com:443 -showcerts /dev/null \
  | openssl x509 -text -noout

# 检查证书过期时间
echo | openssl s_client -servername example.com -connect example.com:443 2>/dev/null \
  | openssl x509 -noout -dates

6. Nginx 配置 TLS:

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate     /etc/nginx/ssl/example.com/fullchain.pem;  # 证书+中间CA
    ssl_certificate_key /etc/nginx/ssl/example.com/privkey.pem;    # 私钥
    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_ciphers         ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers off;  # TLS 1.3 由客户端优先
}

7. 格式转换:

# PEM → DER
openssl x509 -in cert.pem -outform der -out cert.der

# PEM → PKCS#12 (含私钥)
openssl pkcs12 -export -in cert.pem -inkey server.key -out cert.pfx

# 查看 Java cacerts 中的证书
keytool -list -v -keystore $JAVA_HOME/lib/security/cacerts -storepass changeit

4.5.5 证书信任模型

自签名 vs CA 签名:任何人都可以用 OpenSSL 生成自签名证书,无需经过任何第三方。区别在于:自签名证书浏览器会弹"不安全"警告,因为没有 CA 背书;CA 签名证书浏览器信任,显示绿色锁。内网/开发用自签名完全够,公网面向用户则需 CA 签发。

Certificate Trust Model
图 4.5.5: 自签名 vs CA 签名证书信任模型对比

CA 背书是什么:CA(Certificate Authority,证书颁发机构)用它的私钥给你的证书做数字签名 (Digital Signature)——相当于"盖个章"。浏览器/操作系统内置了受信任 CA 的公钥,访问网站时用这个公钥验签:签名验证通过则说明"该证书确实由我信任的 CA 签发,未被伪造",于是显示绿色锁。

为什么需要 CA:公钥本身没法证明"我是谁"。任何人都能把公钥和一个域名写进证书,然后自称是 google.com。浏览器接到这个证书后无法判断真假——它需要一个自己本来就信任的第三方来担保。CA 在签发前会验证你对域名有控制权,所以浏览器信任 CA 的判断。根子上是个信任传递 (Transitive Trust)问题:你不可能认识互联网上所有服务器,但你认识操作系统里预设的那几百个 CA。

根证书为什么不能伪造:你伪造一个根证书,写上"我是 CA",但浏览器会用它内置的根 CA 公钥去验证——这个公钥是编译进操作系统/浏览器的,不修改源码就换不掉。而伪造的证书和真 CA 的私钥不匹配,签名验证直接失败。根证书的安全不靠证书本身,靠的是:私钥在 CA 手里不泄露 + 浏览器预先写死公钥。两个卡住一个就通不过。

证书为什么有免费的也有收费的:

类型验证深度证书内容费用典型场景
DV(域名验证)只验证域名控制权仅含域名免费Let's Encrypt,个人博客、小站点
OV(组织验证)人工核验企业营业执照、法人身份含公司名称数百至数千元/年企业官网、电商
EV(扩展验证)最严格审查,实地核验等含公司名称,曾显示绿色地址栏数千至上万元/年银行、金融、支付

云厂商收费除 OV/EV 人工审核成本外,还附带赔付保险(证书泄露导致钓鱼损失可索赔数十万)和技术支持。普通个人/小站点用 Let's Encrypt 足够了,大企业银行才需要 OV/EV。

术语

缩写全称说明
RSARivest-Shamir-Adleman经典非对称加密算法,可用于加密和签名,密钥 2048-4096 bit
ECDHEElliptic Curve Diffie-Hellman Ephemeral椭圆曲线临时密钥交换。每次会话生成临时密钥对,提供前向保密 (Forward Secrecy)
ECDSAElliptic Curve Digital Signature Algorithm椭圆曲线数字签名 (Digital Signature),比 RSA 密钥短且运算快
DHDiffie-Hellman密钥交换协议。双方在不安全信道上交换公钥后各自计算共享密钥
AES-GCMAdvanced Encryption Standard - Galois/Counter Mode对称加密 + 认证 (Authentication)模式,同时提供加密和完整校验 (Integrity),TLS 1.3 首选
AEADAuthenticated Encryption with Associated Data认证 (Authentication)加密模式,加密的同时自动校验完整性
HMACHash-based Message Authentication Code基于哈希的消息认证 (Authentication)码,保证数据未被篡改
X.509—公钥证书的国际标准格式,定义了证书字段结构
SANSubject Alternative Name证书扩展字段,列出证书覆盖的所有域名
CNCommon Name证书主体通用名,通常为域名。现代浏览器优先检查 SAN
CACertificate Authority证书颁发机构,如 Let's Encrypt、DigiCert
CSRCertificate Signing Request证书签名请求,包含公钥和域名信息,提交给 CA 申请签发
PEMPrivacy-Enhanced MailBase64 文本证书格式,-----BEGIN/END----- 包裹
DERDistinguished Encoding RulesX.509 二进制编码格式,PEM 是 DER 的 Base64 文本化
PKCS#12—二进制格式(.pfx/.p12),含私钥+证书,用于导入浏览器/IIS
JKSJava KeyStoreJava 特有的密钥和证书存储格式
CRLCertificate Revocation List证书吊销列表,CA 定期发布
OCSPOnline Certificate Status Protocol在线证书状态协议,实时查询单张证书是否有效
DV/OV/EVDomain/Organization/Extended Validation证书验证等级:DV 只验证域名(免费);OV 核验企业;EV 最严格
前向保密 (Forward Secrecy)Forward Secrecy即使服务器私钥泄露,历史通信也无法解密。ECDHE 提供,RSA 密钥交换不提供
密码套件 (Cipher Suite)Cipher SuiteTLS 握手协商的算法组合,如 TLS_AES_128_GCM_SHA256

4.6 HTTP 协议(应用层——超文本传输)

HTTP(Hypertext Transfer Protocol)是 Web 的基础。采用请求-响应 (Request-Response)模型,典型工作流:

  1. 建立 TCP/TLS 连接
  2. 发送 HTTP 请求消息
  3. 读取服务器返回的 HTTP 响应消息
  4. 关闭或复用连接

HTTP 请求格式:

METHOD /path HTTP/1.1
Header-Name: value
Header-Name: value
[空行]
[可选请求体]

HTTP 响应格式:

HTTP/1.1 200 OK
Header-Name: value
Content-Type: text/html
[空行]
<!DOCTYPE html>...

常用请求方法:

方法语义安全幂等
GET获取资源是是
POST创建资源 / 提交数据否否
PUT替换资源(全量更新)否是
PATCH部分修改资源否否
DELETE删除资源否是
HEAD获取响应头(无响应体)是是
OPTIONS查询支持的方法是是

HTTP 核心特性:

特性说明
无状态每个请求独立,服务器不保留上下文。通过 Cookie / Session / Token 弥补
可扩展通过 Header 扩展新功能(CORS、CSP、HSTS、Cache-Control 等)
缓存通过 Cache-Control、ETag、Last-Modified 等控制缓存行为
内容协商 (Content Negotiation)通过 Accept、Accept-Language 等 Header 协商返回格式
认证 (Authentication)Basic Auth(Base64)、Bearer Token、Digest Auth、OAuth 2.0 等
CORS跨域资源共享,通过 Access-Control-Allow-Origin 等 Header 控制
Demo: Fetch API 发起 HTTP 请求
fetch('https://api.example.com/users', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({ name: 'Alice', email: 'alice@example.com' })
})
  .then(res => res.json())
  .then(data => console.log(data))
  .catch(err => console.error('Error:', err));

术语

缩写全称说明
CORSCross-Origin Resource Sharing跨域资源共享,通过 HTTP 头允许网页向不同域名发起请求
CSPContent Security Policy内容安全策略,声明允许加载的资源来源,防御 XSS 攻击
HSTSHTTP Strict Transport Security强制 HTTPS,告知浏览器永远用 HTTPS 访问该域名
ETagEntity Tag资源版本标识,配合 If-None-Match 实现条件请求(304)
MIMEMultipurpose Internet Mail Extensions数据类型标识,如 text/html、application/json
幂等Idempotent同一操作执行多次与一次效果相同。GET/PUT/DELETE 幂等,POST 不幂等
Cookie—服务器让浏览器存储的小段数据,每次请求自动带回,维持会话状态
Session—服务端存储的用户会话数据,客户端只持有 Session ID
Token—自包含凭证(如 JWT),服务端可无状态验证,不需要服务端存储

4.7 HTTP/2 & HTTP/3(QUIC)

特性HTTP/1.1HTTP/2HTTP/3 (QUIC)
传输层TCPTCPUDP (QUIC)
多路复用无(需多个连接)Stream 多路复用Stream 多路复用(无队头阻塞 (Head-of-Line Blocking))
头部压缩无HPACKQPACK
加密可选(TLS)可选(TLS,浏览器要求必须)内置 TLS 1.3
连接建立TCP + TLS (2-3 RTT)TCP + TLS (2-3 RTT)0-RTT / 1-RTT
服务器推送无支持支持
队头阻塞 (Head-of-Line Blocking)有(连接级)有(TCP 级)无
RFC7230-723575409114
HTTP Version Evolution
图 4.7: HTTP/1.1 → HTTP/2 → HTTP/3 演进对比
关键区别:HTTP/2 在 TCP 上实现多路复用,但 TCP 丢包仍然会导致所有 Stream 阻塞(TCP 级 HOL Blocking)。HTTP/3 的 QUIC 直接在 UDP 上实现可靠传输,每个 Stream 独立,一个 Stream 丢包不影响其他 Stream。此外 QUIC 内置 TLS 1.3,连接迁移 (Connection Migration)支持切换网络(如 Wi-Fi → 4G)不断连。

术语

缩写全称说明
HOL BlockingHead-of-Line Blocking队头阻塞 (Head-of-Line Blocking)。一个包的丢失/延迟导致后续所有包都被堵住
HPACK—HTTP/2 头部压缩算法,使用静态/动态字典
QPACK—HTTP/3 头部压缩算法,解决 HPACK 在 QUIC 上的队头阻塞 (Head-of-Line Blocking)问题
QUICQuick UDP Internet Connections基于 UDP 的新一代传输层协议,内置 TLS 1.3、多路复用、0-RTT、连接迁移 (Connection Migration)
Stream—单连接内独立的双向字节流 (Byte Stream),多路复用允许多个 Stream 并发互不阻塞
连接迁移 (Connection Migration)Connection MigrationQUIC 特性:切换网络(Wi-Fi→4G)保持连接不断,通过 Connection ID 而非 IP 标识

4.8 SSE 服务器推送(Server-Sent Events)

SSE 是 HTTP 标准的一部分(HTML Standard / text/event-stream),允许服务器通过一个持久的 HTTP 长连接 (Persistent Connection)单向向客户端推送数据流。与 WebSocket 不同,SSE 仅支持服务器 → 客户端方向,但不需要协议升级 (Protocol Upgrade),天然兼容 HTTP 基础设施(代理、CDN、认证 (Authentication))。

特性说明
方向单向:服务器 → 客户端(客户端用普通 HTTP 发请求)
传输层HTTP/1.1 长连接 (Persistent Connection)(Connection: keep-alive)或 HTTP/2 Stream
MIME 类型text/event-stream
自动重连 (Automatic Reconnection)内置:连接断开后浏览器自动重连 (Automatic Reconnection)(Last-Event-ID)
事件类型默认 message,可自定义 event: xxx 字段
客户端 APIEventSource 构造函数(标准浏览器 API)
二进制数据仅支持 UTF-8 文本(二进制需 Base64 编码)

SSE 数据格式(text/event-stream):

event: update\n
id: 42\n
data: {"price": 18.5, "change": +0.3}\n
\n
data: {"price": 18.7, "change": +0.2}\n
\n

字段说明:data: 定义消息体;event: 自定义事件名;id: 消息编号(用于断线重连);空行(\n\n)表示消息边界。

Demo: Node.js SSE 服务端 + 浏览器 EventSource 客户端
server-sse.js (Node.js)
const http = require('http');
http.createServer((req, res) => {
  res.writeHead(200, {
    'Content-Type': 'text/event-stream',
    'Cache-Control': 'no-cache',
    'Connection': 'keep-alive',
    'Access-Control-Allow-Origin': '*'
  });
  let id = 0;
  setInterval(() => {
    res.write(`id: ${++id}\\n`);
    res.write(`data: ${JSON.stringify({ time: Date.now(), id })}\\n\\n`);
  }, 1000);
}).listen(3000);
console.log('SSE server on http://localhost:3000');
client.html (浏览器)
const es = new EventSource('http://localhost:3000');
es.onmessage = (e) => console.log('Message:', JSON.parse(e.data));
es.onerror  = () => console.log('Disconnected, auto-reconnecting...');
// 自定义事件监听
es.addEventListener('update', (e) => console.log('Update:', e.data));
// 关闭连接
// es.close();
SSE Sequence
图 4.8: SSE 服务器推送时序图
SSE vs WebSocket 选择:如果只需服务器推数据、走 HTTP 协议栈 (Protocol Stack)无需特殊配置,选 SSE;如果需要双向实时通信、二进制数据、自定义子协议,选 WebSocket。许多场景(股价推送、通知流、日志监控)SSE 比 WebSocket 更合适。

4.9 WebSocket 协议

WebSocket(RFC 6455)提供全双工 (Full-Duplex)、低延迟、持久的双向通信通道。它通过 HTTP Upgrade 机制从 HTTP/1.1 升级到 ws:// 或加密 wss:// 协议,之后数据以帧(Frame)的形式双向传输,不再有 HTTP 头部开销。

特性说明
方向全双工 (Full-Duplex):客户端 ↔ 服务器双向
握手HTTP Upgrade(101 Switching Protocols)
帧开销最小 2 字节(相比 HTTP 显著降低)
支持数据类型文本(UTF-8)和二进制(Blob/ArrayBuffer)
客户端 APIWebSocket 构造函数(标准浏览器 API)
子协议STOMP、MQTT、WAMP 等
代理兼容性需要代理支持 WebSocket(部分老代理不支持)
Demo: Node.js ws 库实现 WebSocket
server-ws.js (需 npm install ws)
const { WebSocketServer } = require('ws');
const wss = new WebSocketServer({ port: 8080 });
wss.on('connection', (ws) => {
  console.log('Client connected');
  ws.on('message', (data) => {
    console.log('Received:', data.toString());
    ws.send(`Echo: ${data}`);
  });
  ws.send('Welcome to WebSocket server');
});
client.html (浏览器)
const ws = new WebSocket('ws://localhost:8080');
ws.onopen  = () => { ws.send('Hello Server!'); };
ws.onmessage = (e) => console.log('Received:', e.data);
ws.onclose = () => console.log('Disconnected');
ws.onerror = (e) => console.error('Error:', e);
// ws.close();
WebSocket Sequence
图 4.9: WebSocket 握手与通信时序图
对比维度SSEWebSocket
通信方向服务器 → 客户端(单向)双向
协议HTTP(标准)ws:// / wss://(独立协议)
数据格式UTF-8 文本文本 + 二进制
自动重连 (Automatic Reconnection)内置需手动实现
心跳保活可选(浏览器端无 API)ping/pong 帧
代理/CDN 兼容天然兼容 HTTP需代理支持 Upgrade
典型场景通知、股价、日志流、AI 流式输出聊天、协作编辑、游戏、实时仪表盘

术语

缩写说明
全双工 (Full-Duplex)双方可同时发送数据(如电话)。vs 半双工 (Half-Duplex):同一时间只能一方发(如对讲机)
opcodeWebSocket 帧操作码:1=文本, 2=二进制, 8=关闭, 9=ping, 10=pong
ping/pong心跳机制。一方发 ping 帧,另一方须回 pong,用于检测连接存活
HTTP UpgradeHTTP/1.1 机制。客户端发送 Upgrade: websocket 头,服务器回应 101 切换协议

4.10 网络代理 (Proxy)

代理服务器(Proxy)是介于客户端与目标服务器之间的中转节点。根据部署方向和使用场景,分为正向代理 (Forward Proxy)和反向代理 (Reverse Proxy)两大类。

4.10.0 程序为什么会走代理

程序走代理的本质是:不直接连目标服务器,而是先连代理服务器,让代理帮你转发请求。实现方式分两种:

1. 程序自己读代理配置(显式代理 (Explicit Proxy)):

程序启动时检查环境变量 http_proxy / https_proxy 或自身配置文件。如果配了代理,就直接把请求发到代理地址而不是目标地址。curl、git、npm、pip 等工具都遵循这套约定——遍历 proxy 类环境变量,有就发给代理,没有就直连。

# 底层原理(以 curl 为例,伪代码)
target = "https://example.com"
proxy  = getenv("https_proxy")       # http://127.0.0.1:8080
if proxy:
    tcp_connect(proxy)               # 连代理 127.0.0.1:8080
    send("CONNECT example.com:443")  # 让代理去连目标
else:
    tcp_connect("example.com:443")   # 直连目标

2. 系统层劫持流量(透明代理 (Transparent Proxy) / TUN):

程序以为自己直连目标,实际上操作系统或网络设备在内核层把流量拦截下来,重定向到代理。

方式一:iptables REDIRECT / TPROXY

利用 Linux 内核的 Netfilter 框架,在数据包经过协议栈 (Protocol Stack)时用 iptables 规则匹配并改写目标地址:

# 将所有出站 TCP 80/443 流量劫持到本地 8080 端口
iptables -t nat -A OUTPUT -p tcp --dport 80  -j REDIRECT --to-port 8080
iptables -t nat -A OUTPUT -p tcp --dport 443 -j REDIRECT --to-port 8080

数据包路径:

  1. 程序调用 connect("example.com:443"),内核构造 SYN 包,目标 = example.com:443
  2. 包经过 OUTPUT 链 nat 表,命中 REDIRECT 规则,目标地址被改写为 127.0.0.1:8080
  3. 包到达本地 8080 端口(代理程序在监听)
  4. 代理收到连接后,通过 getsockopt(SO_ORIGINAL_DST) 获取原始目标地址,然后自己去连真正的 example.com:443

关键:改写发生在内核 netfilter,用户态程序完全不知情。程序以为自己连了 example.com,实际 TCP 连接被偷换成了代理。REDIRECT 只适用于代理在本机;跨机器的网关场景用 TPROXY(保留原始目标地址不修改)。

方式二:路由 + TUN 虚拟网卡

大多数翻墙代理(Clash、Shadowsocks、v2ray)用的方案:

# 虚拟网卡 tap/tun 是什么
ip tuntap add tun0 mode tun           # 创建虚拟三层网卡(无 MAC,纯 IP)
ip addr add 198.18.0.1/16 dev tun0    # 配 IP
ip link set tun0 up                   # 启用
ip route add default via 198.18.0.1 dev tun0 metric 1   # 默认路由走虚拟网卡

机制:

  1. 程序调用 send(sock, http_request),数据经内核 TCP/IP 栈封装成 IP 包
  2. 内核查路由表,匹配到 default via 198.18.0.1 dev tun0,把 IP 包写入 /dev/net/tun 字符设备
  3. 代理程序从 /dev/net/tun 的 fd 里 read() 读出原始 IP 包
  4. 代理解析包中的目标 IP:Port,自己建加密隧道连远端服务器,把 IP 包转发过去
  5. 远端代理解包,以原始目标建 TCP 连接,把 payload 写入 → 响应原路返回

TUN 工作在网络层(IP 包),能劫持所有协议(TCP/UDP/ICMP 全部一刀切)。TAP 工作在链路层(以太帧),多一层 MAC 头,一般用于 VPN 做二层隧道。代理程序收到的就是完整的原始 IP 包,需要自己实现 TCP 状态跟踪。

TUN vs REDIRECT
图 4.10.0: iptables REDIRECT vs TUN 虚拟网卡流量劫持对比

方式三:浏览器 PAC(Proxy Auto-Config)

浏览器从 PAC URL 下载一个 JavaScript 文件,里面有 FindProxyForURL(url, host) 函数。浏览器每次发请求前调用这个函数,根据返回值决定:

function FindProxyForURL(url, host) {
    if (shExpMatch(host, "*.internal.com")) return "DIRECT";              // 直连
    if (shExpMatch(host, "*.google.com"))   return "PROXY 127.0.0.1:1080"; // 走代理
    return "SOCKS5 127.0.0.1:1080";                                       // 默认走 SOCKS5
}

PAC 只是"决策脚本",不劫持流量——浏览器拿到决策后自己选择连代理还是直连,跟显式代理 (Explicit Proxy)本质一样,只是规则自动化了。

对比三种方式拦截点:

方式拦截层适用范围典型工具
iptables REDIRECT/TPROXY内核 netfilter全局(所有程序),但代理须在本机或网关Squid, Envoy 透明代理 (Transparent Proxy)
TUN 虚拟网卡内核路由 + 字符设备全局、跨机器,支持所有协议Clash(TUN), Shadowsocks-rust, WireGuard
PAC / WPAD应用层(浏览器自己判断)仅浏览器Chrome/Edge 系统代理设置

对比:

方式程序感知典型实现适用
显式代理 (Explicit Proxy)懂代理协议,主动连代理环境变量 (http_proxy)、curl -x、git config http.proxy命令行工具、编程语言 HTTP 库
透明代理 (Transparent Proxy)无感知,以为直连目标iptables REDIRECT、TUN 虚拟网卡、路由器网关全局代理、App 抓包、企业网关

一旦流量进入代理(不管是显式还是透明),后续都是:客户端 ↔ 代理 ↔ 目标服务器,代理做 TCP 字节流 (Byte Stream)转发(正向代理 (Forward Proxy))或按规则路由到后端(反向代理 (Reverse Proxy))。

各语言 HTTP 库代理支持一览:大部分主流语言的标准库或常用 HTTP 库已封装好代理逻辑,开发者写业务代码一般不用自己处理。有代理就走,没有就直连。

语言 / 工具自动读环境变量说明
curl / wget是自动读取 http_proxy / https_proxy,--noproxy 可跳过
Python requests是自动从环境变量读代理,也支持 proxies 参数显式指定
Python httpx是同 requests,默认读环境变量
Go net/http半自动需在 Transport 里设 Proxy: http.ProxyFromEnvironment,默认 Transport 会自动配
Rust reqwest是默认自动读 HTTP_PROXY / HTTPS_PROXY
Node.js fetch (v18+)否不自带代理支持,需额外装 global-agent 包或手动配 undici agent
Node.js axios半自动支持 proxy 配置项,不自动读环境变量
Java HttpURLConnection否需 System.setProperty("http.proxyHost", ...") 手动设,或用 OkHttp / Apache HttpClient 等库
git是git config http.proxy,也支持 http_proxy 环境变量
npm / yarn / pip是自动读环境变量,也可 CLI 参数 --proxy 覆盖

本质都是同一条链路:

程序 → 读环境变量/配置 → 有代理就连代理:port → 代理转发到目标
                          → 无代理就直连目标

代理判断逻辑在用户态 HTTP 库里,内核只负责建 TCP 连接,不关心连接的是代理还是目标。

4.10.1 正向代理 (Forward Proxy) vs 反向代理 (Reverse Proxy)

维度正向代理 (Forward Proxy)反向代理 (Reverse Proxy)
服务对象客户端(出站)服务端(入站)
客户端感知需显式配置代理地址无感知,认为直连服务器
典型用途科学上网、企业内网管控、匿名访问、缓存负载均衡 (Load Balancing)、SSL 卸载、缓存、安全防护、灰度发布 (Canary Release)
协议HTTP CONNECT / SOCKS5HTTP/HTTPS、TCP/UDP 四层转发
部署位置靠近客户端(出口网关)靠近服务端(入口网关)
软件Squid, Shadowsocks, Clash, v2rayNginx, HAProxy, Envoy, Traefik, Caddy
Forward vs Reverse Proxy
图 4.10.1: 正向代理 (Forward Proxy) vs 反向代理 (Reverse Proxy)部署差异

4.10.2 代理协议类型

协议端口说明
HTTP 代理8080 / 3128最基础的 Web 代理,通过 HTTP CONNECT 方法建立隧道转发 TCP 流(HTTPS 场景)。明文传输,本身无加密
HTTPS 代理8443HTTP 代理 + TLS,代理连接本身也被加密,防止中间人窃听代理流量
SOCKS41080仅支持 TCP,无认证 (Authentication),无 IPv6
SOCKS51080最通用:支持 TCP/UDP、IPv6、用户名/密码认证 (Authentication)。应用层无关,可转发任意协议(HTTP、SSH、FTP、游戏)
透明代理 (TPROXY)—客户端无需配置,通过 iptables/nftables 在内核层劫持流量并重定向到代理。常用于企业网关
反向代理 (Reverse Proxy)80/443接收外部请求,按规则转发到后端。四层 (L4, Stream) 基于 IP:Port 转发;七层 (L7, HTTP) 基于 Host/Path/Header 转发

4.10.3 HTTP CONNECT 隧道机制

浏览器访问 HTTPS 网站时,首先向代理发送 CONNECT 请求建立隧道,之后所有流量(包括 TLS 握手和加密数据)透明穿透代理,代理只做 TCP 字节流 (Byte Stream)转发,无法解密内容(区别于 MITM 代理)。

HTTP CONNECT Tunnel
图 4.10.3: HTTP CONNECT 隧道建立时序
# 客户端 → 代理:建立隧道
CONNECT example.com:443 HTTP/1.1
Host: example.com:443

# 代理 → 客户端:隧道已建立
HTTP/1.1 200 Connection Established

# 此后客户端 ↔ 服务器直通(经代理 TCP 转发)
# TLS 握手、HTTP 请求全部透明穿透

4.10.4 实战操作

1. 命令行使用代理:

# HTTP/HTTPS 代理
export http_proxy="http://127.0.0.1:8080"
export https_proxy="http://127.0.0.1:8080"
export no_proxy="localhost,127.0.0.1,.internal.local"

# SOCKS5 代理 (curl)
curl --socks5 127.0.0.1:1080 https://example.com

# Git 代理
git config --global http.proxy http://127.0.0.1:8080
git config --global http.proxy socks5://127.0.0.1:1080

# SSH 通过代理连接 (ProxyJump / ProxyCommand)
ssh -o ProxyCommand='nc -X 5 -x 127.0.0.1:1080 %h %p' user@remote
# 或 ~/.ssh/config:
# Host remote
#   ProxyJump user@jump-host
#   # 或 ProxyCommand nc -X 5 -x 127.0.0.1:1080 %h %p

2. Nginx 反向代理 (Reverse Proxy)配置:

# L7 HTTP 反向代理
server {
    listen 80;
    server_name api.example.com;
    location / {
        proxy_pass http://backend:3000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

# L4 TCP 反向代理 (Stream 模块, 需编译 --with-stream)
stream {
    upstream mysql_backend {
        server 10.0.1.10:3306;
        server 10.0.1.11:3306 backup;
    }
    server {
        listen 3306;
        proxy_pass mysql_backend;
        proxy_connect_timeout 5s;
    }
}

# SSL 卸载(反向代理终结 TLS,后端 HTTP)
server {
    listen 443 ssl http2;
    server_name example.com;
    ssl_certificate     /etc/nginx/ssl/fullchain.pem;
    ssl_certificate_key /etc/nginx/ssl/privkey.pem;
    location / {
        proxy_pass http://backend:3000;    # 后端只需 HTTP
    }
}

3. 代理环境变量说明:

环境变量作用
http_proxyHTTP 请求使用的代理
https_proxyHTTPS 请求使用的代理(实际走 CONNECT 隧道)
no_proxy不走代理的域名/IP 列表(逗号分隔,支持通配符)
ALL_PROXY所有协议的兜底代理(部分工具支持)
HTTP_PROXY大写形式,部分工具(Docker, Go)识别大写;curl 识别小写。建议同时设置
关键认知:反向代理 (Reverse Proxy)是服务端架构的核心组件。现代微服务中,Nginx/Envoy 作为 API 网关统一处理认证 (Authentication)、限流、日志、路由——服务实例只关心业务逻辑。正向代理 (Forward Proxy)则是客户端出口管控的基础设施,企业中用于审计、过滤、加速。

4.10.5 MITM 调试代理工具

上述代理(正向/反向)只做透明转发 (Transparent Forwarding),不解密流量。而开发调试中经常需要查看和修改加密的 HTTPS 内容,此时需要使用 MITM(Man-in-the-Middle)代理工具。它们通过在本机安装自签 CA 根证书,以中间人身份解密 HTTPS,让开发者可以检查、修改、重放 HTTP 请求。

工具平台特点
CharlesmacOS / Windows / LinuxGUI 友好,功能全面(断点、重写、限速、Map Local/Remote),商业软件
ProxymanmacOS (原生)原生 macOS App,UI 精致,支持 iOS/Android 远程抓包 (Remote Capture),Apple Silicon 原生
mitmproxy跨平台 (CLI)开源、命令行 + Web UI + Python API 脚本化,可编程拦截/修改流量
详见 mitmproxy 系统梳理
Wireshark跨平台网络包级别抓包(非代理,旁路抓取 (Passive Capture)),支持 3000+ 协议解析,需密钥日志文件解密 TLS
更适合底层 TCP/IP 问题排查,非 HTTP 调试首选
FiddlerWindows / Linux (beta)老牌 Windows 抓包工具,支持脚本扩展
MITM vs Forward Proxy
图 4.10.5: 正向代理 (Forward Proxy)(透明转发 (Transparent Forwarding)) vs MITM 代理(解密检查)对比

MITM 工作原理:

  1. 客户端信任 MITM 代理的自签 CA 证书(手动安装到系统/Browser 信任库)
  2. 客户端连接代理,发起 CONNECT 请求
  3. 代理与目标服务器完成真实的 TLS 握手(代理 → 服务器端)
  4. 代理用自签 CA 动态签发一个伪造的目标域名证书,与客户端完成 TLS 握手(客户端 → 代理端)
  5. 代理持有两段 TLS 会话的密钥,可解密、查看、修改双向流量
# mitmproxy 快速上手
brew install mitmproxy            # 安装
mitmweb                          # Web UI 模式 (http://localhost:8081)
# 或 mitmproxy (CLI TUI 模式)

# 设置系统代理指向 mitmproxy 默认端口 8080
export https_proxy="http://127.0.0.1:8080"

# 首次使用需安装证书:浏览器访问 http://mitm.it

# Charles / Proxyman:GUI 工具直接启动,自动配置系统代理
Wireshark vs Charles/Proxyman/mitmproxy:Wireshark 工作在网卡层,旁路抓取 (Passive Capture)所有经过网卡的数据包,不是代理。解密 TLS 需要手动设置 SSLKEYLOGFILE 环境变量导出会话密钥。Charles/Proxyman/mitmproxy 是应用层代理,通过 MITM 技术解密,更方便查看 HTTP 层面的请求和响应。日常 Web/API 调试优先选后者,TCP/IP 底层问题才用 Wireshark。

术语

缩写全称说明
SOCKS5Socket Secure v5通用代理协议,支持 TCP/UDP、IPv6、认证 (Authentication)。应用层无关,可转发任意协议
MITMMan-In-The-Middle中间人代理,通过伪造证书解密 HTTPS 流量,用于调试和抓包
TUN / TAP—虚拟网卡接口:TUN 工作在网络层(IP 包),TAP 工作在链路层(以太帧)
netfilter—Linux 内核网络过滤框架,iptables/nftables 是其用户态管理工具
iptables—Linux 防火墙/流量管理工具,用于包过滤、NAT、流量劫持
PACProxy Auto-Config浏览器代理自动配置脚本,根据 URL 规则决定走代理还是直连
WPADWeb Proxy Auto-Discovery代理自动发现协议,通过 DHCP/DNS 自动找到 PAC 文件 URL
L4 代理—四层代理:基于 IP:Port 转发 TCP/UDP 流,不解析应用协议
L7 代理—七层代理:解析 HTTP 头后根据 Host/Path/Header 路由到不同后端
SSL 卸载SSL Termination反向代理 (Reverse Proxy)在入口处终结 TLS,之后将明文 HTTP 转发到后端服务
API 网关API Gateway微服务统一入口,集成认证 (Authentication)、限流、路由、日志。本质是 L7 反向代理 (Reverse Proxy)+业务逻辑

5. 实战速查手册

5.1 常见端口

端口协议说明
20/21FTP文件传输协议
22SSH安全 Shell
25SMTP邮件发送
53DNS域名解析(UDP/TCP)
67/68DHCPIP 地址自动分配
80HTTP超文本传输
110POP3邮件接收
143IMAP邮件接收(高级)
443HTTPSHTTP over TLS
1080SOCKS5SOCKS5 代理
3128SquidHTTP 代理(Squid 默认)
8080HTTP ProxyHTTP 正向代理 (Forward Proxy)(常见替代端口)
993IMAPSIMAP over TLS
995POP3SPOP3 over TLS
3306MySQL数据库
5432PostgreSQL数据库
6379Redis缓存
27017MongoDB数据库

5.2 HTTP 状态码速查

范围类别常用示例
1xx信息101 Switching Protocols(WebSocket 升级)
2xx成功200 OK, 201 Created, 204 No Content
3xx重定向301 永久, 302 临时, 304 Not Modified(缓存), 307/308 保留方法
4xx客户端错误400 Bad Request, 401 Unauthorized, 403 Forbidden, 404 Not Found, 405 Method Not Allowed, 429 Too Many Requests
5xx服务端错误500 Internal Server Error, 502 Bad Gateway, 503 Service Unavailable, 504 Gateway Timeout

5.3 常用调试命令

场景命令说明
DNS 查询dig example.com / nslookup example.com查询 DNS 记录
连通性测试ping -c 4 example.comICMP 测试网络连通性
路由追踪traceroute example.com / tracert example.com追踪数据包路径
端口检测nc -zv example.com 443 / telnet example.com 80检测端口是否开放
HTTP 请求curl -v https://example.com查看完整的 HTTP 交互
抓包分析tcpdump -i eth0 port 443 -w out.pcap抓取网络包
TLS 证书openssl s_client -connect example.com:443查看 TLS 证书链
性能测试curl -w "@curl-format.txt" https://example.com测量各阶段耗时
连接状态ss -tunap / netstat -an查看当前所有连接
curl-format.txt(放在与 curl 命令同目录下)
    time_namelookup:  %{time_namelookup}\\n
       time_connect:  %{time_connect}\\n
    time_appconnect:  %{time_appconnect}\\n
   time_pretransfer:  %{time_pretransfer}\\n
      time_redirect:  %{time_redirect}\\n
 time_starttransfer:  %{time_starttransfer}\\n
                    ----------\\n
         time_total:  %{time_total}\\n

参考文献